﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Elysium.Demo;
using SIIE_ERP.View;
using SIIE_ERP.Codigo;
using Elysium.Demo.Controls;
using System.Data;
using SIIE_ERP.BaseDatos;

namespace Elysium.Demo.Bancos.Transacciones
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class PagoCliente_Edita : UserControl, IPropiedadesNavegacion
    {
        #region NAVEGACION
        ////////////////////////////////////////////////////////////////////////////
        //  PROPIEDADES DE NAVEGACION
        public string Texto { get { return _texto; } }
        public TabControl TabControlPadre { get { return _tabControlPadre; } }
        public TabItem TabItemPadre { get { return _tabItemPadre; } }

        private string _texto;
        private TabControl _tabControlPadre;
        private TabItem _tabItemPadre;

        public void setParametros(string Texto, ref TabControl tabControl, ref TabItem tabItem)
        {
            this._texto = Texto; this._tabControlPadre = tabControl; this._tabItemPadre = tabItem;
        }

        private void ButtonRegresar_Click(object sender, RoutedEventArgs e)
        {
            _tabControlPadre.Items.Remove(_tabItemPadre);
        }
        // FIN DE PROPIEDADES DE NAVEGACION
        ///////////////////////////////////////////////////////////////////////////
        #endregion

        private UsuarioActivo _sesion;
        private Int32 Secuencia;
        private Int32 CuentaBancaria;
        private Int32 MonedaPago;
        private Int32 IdPago;
        private string Cliente;
        private bool EsIngreso;
        
        public PagoCliente_Edita(UsuarioActivo usuario, string Secuencia)
        {
            InitializeComponent();
            this._sesion = usuario;
            this.Secuencia = Int32.Parse(Secuencia);
            CargarDatos();
            CargarPartidas();
            ComboDocumentos.SelectionChanged += ComboDocumentos_SelectionChanged;
        }

        private void CargarDatos()
        {
            var db = new SIIE_ERP.BaseDatos.Bancos.Transacciones.dbo_Pago_Clientes(_sesion.RFC, _sesion.UserName);
            var pago = db.Get_Pago_A_Cliente_Por_Secuencia(Secuencia).Rows[0];
            
            LabelSecuencia.Content = pago["Secuencia"].ToString();
            LabelCliente.Content = pago["Desc_Cliente"].ToString();
            LabelFecha.Content = Convert.ToDateTime(pago["Fecha_Pago"].ToString().Substring(0, pago["Fecha_Pago"].ToString().Length - 5)).ToShortDateString();
            LabelImporte.Content = pago["Importe"].ToString();
            LabelConcepto.Content = pago["Concepto"].ToString();
            LabelMoneda.Content = pago["Desc_Moneda"].ToString();
            LabelFormaPago.Content = pago["Desc_Forma_Pago"].ToString();
            LabelReferencia.Content = pago["Referencia"].ToString();
            LabelEstatus.Content = SIIE_ERP.View.Mensajes.getMessage((SIIE_ERP.BaseDatos.EstatusDocs_Id)pago["Estatus"]);
            LabelPorAplicar.Content = pago["Pendiente_por_Aplicar"].ToString();

            IdPago = Int32.Parse(pago["Id_Pago"].ToString());
            CuentaBancaria = Int32.Parse(pago["Id_Cuenta"].ToString());
            MonedaPago = Int32.Parse(pago["Id_Moneda"].ToString());
            Cliente = pago["Id_Cliente"].ToString();
            EsIngreso = bool.Parse(pago["EsIngreso"].ToString());

            ComboTipoDocumento.Items.Clear();
            ComboTipoDocumento.Items.Add("Todos los documentos");

            if (bool.Parse(pago["EsIngreso"].ToString()))
            {
                ComboTipoDocumento.Items.Add("Factura");
                ComboTipoDocumento.Items.Add("Remisión");
                ComboTipoDocumento.Items.Add("Recibo de honorarios");
                ComboTipoDocumento.Items.Add("Recibo de arrendamiento");
            }
            else
            {
               // ComboTipoDocumento.Items.Add("Nota de crédito");
                ComboTipoDocumento.Items.Add("Devolución");
            }

            if ((EstatusDocs_Id)Int32.Parse(pago["Estatus"].ToString()) == EstatusDocs_Id.Estatus_Doc_Asentado)
            {
                ButtonAsentar.IsEnabled = false;
                ButtonCancelar.IsEnabled = false;
                Button_Guardar_Copy.IsEnabled = false;
                Button_Guardar.IsEnabled = false;


            }
            if ((EstatusDocs_Id)Int32.Parse(pago["Estatus"].ToString()) == EstatusDocs_Id.Estatus_Doc_Cancelado)
            {
                ButtonAsentar.IsEnabled = false;
                ButtonCancelar.IsEnabled = false;
                Button_Guardar_Copy.IsEnabled = false;
                Button_Guardar.IsEnabled = false;
            }
            ComboTipoDocumento.SelectedIndex = 0;
            ComboBoxUI.ComboDocumentos_AutoComplete(ref ComboDocumentos, _sesion, Cliente, EsIngreso, true);
        }
                  
        // Agrega una partida
        private void Button_Guardar_Click(object sender, RoutedEventArgs e)
        {
            double Saldo_Value = 0;
            double ImporteAsignar_Value = 0;

            try
            {
                Saldo_Value = Double.Parse(CampoSaldo.Text);
            }
            catch (Exception Ex)
            {
                MessageBox.Show("Favor de seleccionar un Documento Válido");
                return;
            }

            try
            {
                ImporteAsignar_Value = Double.Parse(CampoImporteAsignar.Text);
            }
            catch (Exception Ex)
            {
                MessageBox.Show("Favor de ingresar un importe Válido");
                return;
            }

            if (ImporteAsignar_Value > Double.Parse(LabelPorAplicar.Content.ToString()))
            {
                MessageBox.Show("La cantidad ingresada debe ser menor o igual al saldo por aplicar.");
                return;
            }

            if (ImporteAsignar_Value > Double.Parse(CampoSaldo.Text))
            {
                MessageBox.Show("La cantidad ingresada debe ser menor o igual al saldo del documento.");
                return;
            }

            if (ImporteAsignar_Value > 0)
            {
                // Disminuir el valor de Por Asignar
                var ans = new SIIE_ERP.BaseDatos.Bancos.Transacciones.dbo_Pago_Clientes(_sesion.RFC, _sesion.UserName).
                                Update_Pagos_A_Clientes(Secuencia, Double.Parse(CampoImporteAsignar.Text)).Id;
                if (ans != 1)
                {
                    MessageBox.Show("Fatal error");
                    return;
                }

                // Disminuir el valor del saldo del documento               
                var documento = Int32.Parse(new SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_VentasHonorarios(_sesion.RFC, _sesion.UserName)
                                            .Get_Documento_By_Id_Without_FK((ComboDocumentos.SelectedItem as CAutocompleteDocumentos).TipoDocumento,
                                                                 Int32.Parse(ComboDocumentos.SelectedValue.ToString()))
                                                                 .Rows[0]["Id_Moneda"].ToString());

                var FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(MonedaPago, // Id Moneda del Pago
                                                                      Double.Parse(CampoImporteAsignar.Text), _sesion);

                var Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(documento, // Id Moneda del Documento
                            FMonedaToPesos, _sesion);                                    // Este monto esta en la moneda del documento

                ans = new SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_VentasHonorarios(_sesion.RFC, _sesion.UserName).
                        Update_Saldo_Documento_By_Id((ComboDocumentos.SelectedItem as CAutocompleteDocumentos).TipoDocumento,
                                                     Int32.Parse(ComboDocumentos.SelectedValue.ToString()),
                                                    Monto).Id;
                if (ans != 1)
                {
                    MessageBox.Show("Fatal error");
                    return;
                }

                // Actualizar la cuenta bancaria
                var cuenta = Int32.Parse(new SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_Cuenta_Bancaria(_sesion.RFC, _sesion.UserName)
                                                     .Get_Cuenta_Bancaria_Por_Id(CuentaBancaria).Rows[0]["Id_Moneda"].ToString());


                //Calcular el monto de Id de Pago a Id de Cuenta.
                Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(cuenta, // Id Moneda Cuenta Bancaria
                        SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(MonedaPago, // Id Moneda Pago
                                 Double.Parse(CampoImporteAsignar.Text), _sesion), _sesion); // Este monto esta en la moneda de la cuenta bancaria

                // Realizar la operacion
                if (!EsIngreso)
                {
                    Monto = Monto * (-1);
                }

                // Actualizar el saldo de la cuenta bancaria
                ans = new SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_Cuenta_Bancaria(_sesion.RFC, _sesion.UserName)
                                            .Update_Saldo_Cuenta_Bancaria_Por_Id(CuentaBancaria, Monto).Id;
                if (ans != 1)
                {
                    MessageBox.Show("Fatal error");
                    return;
                }

                //Registrar el movimiento
                ans = new SIIE_ERP.BaseDatos.Bancos.Transacciones.dbo_Pago_Clientes(_sesion.RFC, _sesion.UserName)
                                                                 .Insert_Pago_Clientes_Linea(
                                                                    IdPago.ToString(),
                                                                    ComboDocumentos.SelectedValue.ToString(),
                                                                    (ComboDocumentos.SelectedItem as CAutocompleteDocumentos).TipoDocumento,
                                                                    true,
                                                                    Double.Parse(CampoImporteAsignar.Text).ToString(),
                                                                    "1"
                                                                 ).Id;
                if (ans != 1)
                {
                    MessageBox.Show("Fatal error");
                    return;
                }

                MessageBox.Show("Operacion realizada correctamente");
                CampoImporteAsignar.Text = "";
                CargarDatos();
                CargarPartidas();
                ComboDocumentos.SelectedItem = null;
            }
            else
            {
                MessageBox.Show("Favor de Ingresar una cantidad mayor a cero en Importe por Aplicar.");
            }
        }

        // Carga las partidas
        private void CargarPartidas()
        {
            var db = new SIIE_ERP.BaseDatos.Bancos.Transacciones.dbo_Pago_Clientes(_sesion.RFC, _sesion.UserName);
            var partidas = db.Get_Pagos_A_Clientes_Lineas(IdPago.ToString()).Rows;

            PartidasDataGrid.Items.Clear();
            foreach (DataRow partida in partidas)   
            {
                var Serie = new SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_VentasHonorarios(_sesion.RFC, _sesion.UserName)
                                        .Get_Serie_Documento_By_Id((SIIE_ERP.BaseDatos.Documentos_Id)partida["Id_TipoDocumento"], Int32.Parse(partida["Id_Doc"].ToString()));
                var Documento = Get_Tipo_Documento_Name(partida["Id_TipoDocumento"]) + Serie + partida["Id_Doc"].ToString();
                var Importe = partida["Importe"].ToString();
                var Fecha = partida["Fecha_Alta"].ToString();
                PartidasDataGrid.Items.Add(new CPagoClientes(Documento, Importe, Fecha));
            }
        }        

        // Actualiza la lista de documentos cuando el tipo de documento cambia.
        private void ComboTipoDocumento_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if(ComboTipoDocumento.SelectedValue != null && Cliente != null)
            {
                if(ComboTipoDocumento.SelectedValue.Equals("Todos los documentos"))
                {
                    ComboBoxUI.ComboDocumentos_AutoComplete(ref ComboDocumentos, _sesion, Cliente, EsIngreso, true);
                }
                // DOCUMENTOS DE ENTRADA
                else if (ComboTipoDocumento.SelectedValue.Equals("Factura"))
                {
                    ComboBoxUI.ComboDocumentos_AutoComplete(ref ComboDocumentos, _sesion, Cliente, true, false, SIIE_ERP.BaseDatos.Documentos_Id.Doc_FacturaCliente);
                }
                else if (ComboTipoDocumento.SelectedValue.Equals("Remisión"))
                {
                    ComboBoxUI.ComboDocumentos_AutoComplete(ref ComboDocumentos, _sesion, Cliente, true, false, SIIE_ERP.BaseDatos.Documentos_Id.Doc_Remision);
                }
                else if (ComboTipoDocumento.SelectedValue.Equals("Recibo de honorarios"))
                {
                    ComboBoxUI.ComboDocumentos_AutoComplete(ref ComboDocumentos, _sesion, Cliente, true, false, SIIE_ERP.BaseDatos.Documentos_Id.Doc_ReciboHonorariosVentas);
                }
                else if (ComboTipoDocumento.SelectedValue.Equals("Recibo de arrendamiento"))
                {
                    ComboBoxUI.ComboDocumentos_AutoComplete(ref ComboDocumentos, _sesion, Cliente, true, false, SIIE_ERP.BaseDatos.Documentos_Id.Doc_ReciboArrendamientoVentas);
                }
                // DOCUMENTOS DE SALIDA
                //else if (ComboTipoDocumento.SelectedValue.Equals("Nota de crédito"))
                //{
                //    ComboBoxUI.ComboDocumentos_AutoComplete(ref ComboDocumentos, _sesion, Cliente, false, false, SIIE_ERP.BaseDatos.Documentos_Id.Doc_NotaCreditoCliente);
                //}
                else if (ComboTipoDocumento.SelectedValue.Equals("Devolución"))
                {
                    ComboBoxUI.ComboDocumentos_AutoComplete(ref ComboDocumentos, _sesion, Cliente, false, false, SIIE_ERP.BaseDatos.Documentos_Id.Doc_DevolucionCliente);
                }
            }
        }

        // Actualiza el saldo cuando el documento seleccionado cambia
        private void ComboDocumentos_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var db = new SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_VentasHonorarios(_sesion.RFC, _sesion.UserName);
            var seleccionado = ((sender as FilteredComboBox).SelectedItem as CAutocompleteDocumentos);
            if (seleccionado != null)
            {
                var saldo = db.Get_Saldo_Documento_By_Id(seleccionado.TipoDocumento, Int32.Parse(seleccionado.Id), MonedaPago);
                CampoSaldo.Text = saldo.ToString();
            }
            else
            {
                CampoSaldo.Text = "";
            }
        }

        // Para el datagrid de las partidas
        class CPagoClientes
        {
            public string Documento { get; set; }
            public string Importe { get; set; }
            public string Fecha { get; set; }
            public CPagoClientes(string Documento, string Importe, string Fecha)
            {
                this.Documento = Documento;
                this.Importe = Importe;
                this.Fecha = Fecha;
            }
        }

        private string Get_Tipo_Documento_Name(object s)
        {
            SIIE_ERP.BaseDatos.Documentos_Id doc = (SIIE_ERP.BaseDatos.Documentos_Id)s;
            if (doc == SIIE_ERP.BaseDatos.Documentos_Id.Doc_FacturaCliente)
            {
                return "Factura ";
            }
            if (doc == SIIE_ERP.BaseDatos.Documentos_Id.Doc_ReciboHonorariosVentas)
            {
                return "R. de Honorarios ";
            }
            if (doc == SIIE_ERP.BaseDatos.Documentos_Id.Doc_ReciboArrendamientoVentas)
            {
                return "R. de Arrendamiento ";
            }
            if (doc == SIIE_ERP.BaseDatos.Documentos_Id.Doc_Remision)
            {
                return "Remision ";
            }
            if (doc == SIIE_ERP.BaseDatos.Documentos_Id.Doc_DevolucionCliente)
            {
                return "Devolución ";
            }
            //if (doc == SIIE_ERP.BaseDatos.Documentos_Id.Doc_NotaCreditoCliente)
            //{
            //    return "Nota de Crédito ";
            //}
            return "";
        }

        // Limpiar el saldo
        private void Button_Guardar_Copy_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("¿Esta seguro de limpiar el saldo?", "Limpiar", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
            {
                var ans = new SIIE_ERP.BaseDatos.Bancos.Transacciones.dbo_Pago_Clientes(_sesion.RFC, _sesion.UserName).
                                       Update_Pagos_A_Clientes_Zero(Secuencia).Id;
                if (ans == 1)
                {
                    CargarDatos();
                }
                else
                {
                    MessageBox.Show("Error la limpiar el saldo.");
                }
            }
        }

        //Asentar Pago
        private void ButtonAsentar_Click(object sender, RoutedEventArgs e)
        {

            try
            {
                var db = new SIIE_ERP.BaseDatos.Bancos.Transacciones.dbo_Pago_Clientes(_sesion.RFC, _sesion.UserName);
                Respuesta R = db.Updata_Documento_Estatus(Secuencia, Documentos_Id.Doc_PagoCliente, EstatusDocs_Id.Estatus_Doc_Asentado);

                if (R.Id != 1)
                {
                    MessageBox.Show("Error");
                }
                else
                {


                    _tabControlPadre.Items.Remove(_tabItemPadre);
                    SIIE_ERP.View.NavegacionUI.AbrirPestanaEditar(Secuencia.ToString(),
                                                             typeof(PagoCliente_Edita),
                                                             ref _tabControlPadre, _sesion);
                }
                
            }
            catch (Exception)
            {

                MessageBox.Show("Error");
            }
        }

        //Cancelar pago
        private void ButtonCancelar_Click(object sender, RoutedEventArgs e)
        {
            var db = new SIIE_ERP.BaseDatos.Bancos.Transacciones.dbo_Pago_Clientes(_sesion.RFC, _sesion.UserName);
            Respuesta R = db.Updata_Documento_Estatus(Secuencia, Documentos_Id.Doc_PagoCliente , EstatusDocs_Id.Estatus_Doc_Cancelado);

            if (R.Id != 1)
            {
                MessageBox.Show("Error");
            }
            else
            {
                _tabControlPadre.Items.Remove(_tabItemPadre);
                SIIE_ERP.View.NavegacionUI.AbrirPestanaEditar(Secuencia.ToString(),
                                                         typeof(EstatusDocs_Id),
                                                         ref _tabControlPadre, _sesion);
            }
        }

   

        /// Validacion del campo Importe por asignar.
        private void CampoImporteAsignar_LostFocus(object sender, RoutedEventArgs e)
        {
            
        }

        // Ayuda
        private void ButtonInformacion_Click_1(object sender, RoutedEventArgs e)
        {
            WindowAyuda Ayuda = new Elysium.Demo.WindowAyuda("Pagos_Cliente.htm", "Ayuda");
            Ayuda.Owner = SIIE_ERP.View.NavegacionUI.GetParentWindow(this); Ayuda.ShowDialog();
        }

        // Mostrar documentos relacionados
        private void ButtonF5_Click(object sender, RoutedEventArgs e)
        {
            WindowRelacion Relacion = new Elysium.Demo.WindowRelacion(IdPago, SIIE_ERP.BaseDatos.Documentos_Id.Doc_PagoCliente);
            Relacion.Owner = SIIE_ERP.View.NavegacionUI.GetParentWindow(this); Relacion.ShowDialog();
        }

        // Duplicar el documento
        private void ButtonF6_Click(object sender, RoutedEventArgs e)
        {
            // Duplicar los datos
            var db = new SIIE_ERP.BaseDatos.Bancos.Transacciones.dbo_Pago_Clientes(_sesion.RFC, _sesion.UserName);
            var pago = db.Get_Pago_A_Cliente_Por_Secuencia(Secuencia).Rows[0];

            string TipoPago_Cliente = "";

            if (pago["EsIngreso"].ToString().Equals("False"))
            {
                TipoPago_Cliente = "Egreso";
            }
            else
            {
                TipoPago_Cliente = "Ingreso";
            }

            if(db.Insert_Pago_Cliente_Cab(pago["Id_Cliente"].ToString(), 
                                          Convert.ToDateTime(pago["Fecha_Pago"].ToString().Substring(0, pago["Fecha_Pago"].ToString().Length - 5)),
                                          pago["Id_Forma_Pago"].ToString(),
                                          pago["Id_Cuenta"].ToString(),
                                          pago["Concepto"].ToString(),
                                          pago["Referencia"].ToString(),
                                          pago["Id_Moneda"].ToString(),
                                          pago["Importe"].ToString(),
                                          TipoPago_Cliente).Id != 1)
            {
                MessageBox.Show("Fatal Error");
            }

            // Obtener el Id del registro que se acaba de insertar
            var pagos = db.Get_Pagos_A_Clientes();
            var IdDestino = Int32.Parse(pagos.Rows[0]["Id_Pago"].ToString());

            // Insertar registro
            SIIE_ERP.BaseDatos.dbo_Trans_Relacion_Documentos
                              .Insert_Relacion_Documentos(  IdPago, 
                                                            IdDestino,
                                                            SIIE_ERP.BaseDatos.Documentos_Id.Doc_PagoCliente,
                                                            SIIE_ERP.BaseDatos.Documentos_Id.Doc_PagoCliente,
                                                            _sesion.UserName);

            SIIE_ERP.View.NavegacionUI.AbrirPestanaEditar(IdDestino.ToString(), typeof(PagoCliente_Edita), ref _tabControlPadre, _sesion);

            MessageBox.Show("Registro duplicado exitosamente.");
        }

      
        
    }
}
